diff --git a/cpu/ppc4xx/fdt.c b/cpu/ppc4xx/fdt.c
index dcedbbb..3ef3000 100644
--- a/cpu/ppc4xx/fdt.c
+++ b/cpu/ppc4xx/fdt.c
@@ -35,25 +35,18 @@
 #if defined(CONFIG_OF_LIBFDT)
 #include <libfdt.h>
 #include <libfdt_env.h>
+#include <fdt_support.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
-static void do_fixup(void *fdt, const char *node, const char *prop,
-		     const void *val, int len, int create)
-{
-#if defined(DEBUG)
-	int i;
-	debug("Updating property '%s/%s' = ", node, prop);
-	for (i = 0; i < len; i++)
-		debug(" %.2x", *(u8*)(val+i));
-	debug("(%d)\n", *(u32 *)val);
-#endif
-	int rc = fdt_find_and_setprop(fdt, node, prop, val, len, create);
-	if (rc)
-		printf("Unable to update property %s:%s, err=%s\n",
-		       node, prop, fdt_strerror(rc));
-}
+/*
+ * The aliases needed for this generic etherne MAC address
+ * fixup function are not in place yet. So don't use this
+ * approach for now. This will be enabled later.
+ */
+#undef USES_FDT_ALIASES
 
+#ifndef USES_FDT_ALIASES
 static void do_fixup_macaddr(void *fdt, int offset, const void *val, int i)
 {
 	int rc;
@@ -69,87 +62,47 @@
 		printf("Unable to update property %s, err=%s\n",
 		       "local-mac-address", fdt_strerror(rc));
 }
-
-static void do_fixup_u32(void *fdt, const char *node, const char *prop,
-			 u32 val, int create)
-{
-	val = cpu_to_fdt32(val);
-	do_fixup(fdt, node, prop, &val, sizeof(val), create);
-}
-
-static void do_fixup_uart(void *fdt, int offset, int i, bd_t *bd)
-{
-	int rc;
-	u32 val;
-	PPC4xx_SYS_INFO sys_info;
-
-	get_sys_info(&sys_info);
-
-	debug("Updating node UART%d: clock-frequency=%d\n", i, gd->uart_clk);
-
-	val = cpu_to_fdt32(gd->uart_clk);
-	rc = fdt_setprop(fdt, offset, "clock-frequency", &val, 4);
-	if (rc)
-		printf("Unable to update node UART, err=%s\n", fdt_strerror(rc));
-
-	val = cpu_to_fdt32(bd->bi_baudrate);
-	rc = fdt_setprop(fdt, offset, "current-speed", &val, 4);
-	if (rc)
-		printf("Unable to update node UART, err=%s\n", fdt_strerror(rc));
-}
+#endif /* USES_FDT_ALIASES */
 
 void ft_cpu_setup(void *blob, bd_t *bd)
 {
-	char * cpu_path = "/cpus/" OF_CPU;
+	char *cpu_path = "/cpus/" OF_CPU;
 	sys_info_t sys_info;
 	int offset;
 	int i;
-	int tmp[2];
 
-	get_sys_info (&sys_info);
+	get_sys_info(&sys_info);
 
-	do_fixup_u32(blob, cpu_path, "timebase-frequency", bd->bi_intfreq, 1);
-	do_fixup_u32(blob, cpu_path, "clock-frequency", bd->bi_intfreq, 1);
-	do_fixup_u32(blob, "/plb", "clock-frequency", sys_info.freqPLB, 1);
-	do_fixup_u32(blob, "/plb/opb", "clock-frequency", sys_info.freqOPB, 1);
-	do_fixup_u32(blob, "/plb/opb/ebc", "clock-frequency", sys_info.freqEBC, 1);
-
-	/* update, or add and update /memory node */
-	offset = fdt_find_node_by_path(blob, "/memory");
-	if (offset < 0) {
-		offset = fdt_add_subnode(blob, 0, "memory");
-		if (offset < 0)
-			debug("failed to add /memory node: %s\n",
-			      fdt_strerror(offset));
-	}
-	if (offset >= 0) {
-		fdt_setprop(blob, offset, "device_type",
-			    "memory", sizeof("memory"));
-		tmp[0] = cpu_to_fdt32(bd->bi_memstart);
-		tmp[1] = cpu_to_fdt32(bd->bi_memsize);
-		fdt_setprop(blob, offset, "reg", tmp, sizeof(tmp));
-		debug("Updating /memory node to %d:%d\n",
-		      bd->bi_memstart, bd->bi_memsize);
-	}
+	do_fixup_by_path_u32(blob, cpu_path, "timebase-frequency", bd->bi_intfreq, 1);
+	do_fixup_by_path_u32(blob, cpu_path, "clock-frequency", bd->bi_intfreq, 1);
+	do_fixup_by_path_u32(blob, "/plb", "clock-frequency", sys_info.freqPLB, 1);
+	do_fixup_by_path_u32(blob, "/plb/opb", "clock-frequency", sys_info.freqOPB, 1);
+	do_fixup_by_path_u32(blob, "/plb/opb/ebc", "clock-frequency",
+			     sys_info.freqEBC, 1);
+	fdt_fixup_memory(blob, (u64)bd->bi_memstart, (u64)bd->bi_memsize);
 
 	/*
 	 * Setup all baudrates for the UARTs
 	 */
-	offset = 0;
-	for (i = 0; i < 4; i++) {
-		offset = fdt_find_node_by_type(blob, offset, "serial");
-		if (offset < 0)
-			break;
+	do_fixup_by_compat_u32(blob, "ns16550", "clock-frequency", gd->uart_clk, 1);
 
-		do_fixup_uart(blob, offset, i, bd);
-	}
-
+#ifdef USES_FDT_ALIASES
 	/*
-	 * Setup all MAC addresses in fdt
+	 * The aliases needed for this generic etherne MAC address
+	 * fixup function are not in place yet. So don't use this
+	 * approach for now. This will be enabled later.
 	 */
-	offset = 0;
+	fdt_fixup_ethernet(blob, bd);
+#else
+	offset = -1;
 	for (i = 0; i < 4; i++) {
-		offset = fdt_find_node_by_type(blob, offset, "network");
+		/*
+		 * FIXME: This will cause problems with emac3 compatible
+		 * devices, like on 405GP. But hopefully when we deal
+		 * with those devices, the aliases stuff will be in
+		 * place.
+		 */
+		offset = fdt_node_offset_by_compatible(blob, offset, "ibm,emac4");
 		if (offset < 0)
 			break;
 
@@ -174,5 +127,6 @@
 #endif
 		}
 	}
+#endif /* USES_FDT_ALIASES */
 }
 #endif /* CONFIG_OF_LIBFDT */
